#ifndef  __MAIN_UI_H__
#define  __MAIN_UI_H__

#include "gd32f3x0.h"
#include <stdbool.h>

/**
 * 结构化编程,对人有益,但是费计算机资源......
 */

typedef enum
{
    ITEM_CHECK_BOX,     //针对checkbox条目而言的
    ITEM_SUBSCRIPT_1,   //针对一行有一个色块的情况而言的
    ITEM_SUBSCRIPT_2,   //针对一行有两个色块的情况而言的
    ITEM_SUBSCRIPT_3,   //针对上面的标题菜单而言的
    ITEM_CURSOR,        //针对要设置数字的条目而言的
    ITEM_ALL,
}ItemType_Typedef;

typedef struct MenuItem   //因为结构体成员还指向结构体本身,故结构体的别名不可少  这里的MenuItem就是别名
{   
    uint8_t start_x;      //条目色块的x坐标起始地址
    uint16_t start_y;      //条目色块的y坐标起始地址  注意是uint16_t
    uint8_t length;       //条目色块的长度
    uint8_t height;       //条目色块的高度

    uint8_t MenuItemCount;      //菜单包含的条目数(菜单中的每个条目他们的这个变量的值相同)
    bool IsSelect;              //如果有checkbox图标的话,表示当前的图标是checked还是unchecked
    bool IsCursor;              //表示当前光标是否在此
    bool IsFocus;               //表示当前的编辑菜单栏条目是否被选中
    ItemType_Typedef ItemType;  //当前条目的类型
    const uint8_t * unchecked; //checkbox_unchecked 图标的地址
    const uint8_t * checked;   //checkbox_checked   图标的地址
    const char * title;        //条目显示的内容
    void (*Function)(void);      //菜单条目对应的动作(函数)   
    struct MenuItem * ParentMenu;  //上一级菜单
    struct MenuItem * ChildMenu;   //下一级菜单  同一级的菜单用数组来组织(和function互斥,两者不可共存)
}MenuItem_Typedef;  //这里是声明一个新的变量类型

extern MenuItem_Typedef *CurMenu;   //指向当前的UI界面(是一个数组的首地址)很多个条目
extern MenuItem_Typedef *CurItem; 
extern uint8_t cursor_index;     //光标索引变量
extern bool IsChangeMenu;  //表示是否对当前的界面进行重绘


extern uint8_t percentage_of_repel_medicine;
extern uint8_t percentage_of_fumigate_medicine;

void GotoNextMenu(void);   //
void GotoLastMenu(void);
void DrawMenu(MenuItem_Typedef *Menu);
void ShowGasConcentration(uint8_t refresh);
void DrawRemainingMedicine(uint8_t R,uint8_t C);
void ShowMedicineQuantity(uint8_t refresh);

void UpDownShiftFunction(void);
void LeftRightShiftFunction(void);
void SetAndEscFunction(void);

void ShowInforOnBrow(void);

#endif